package 中国.杨森.实验室.jpa;

import java.util.List;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;

import org.junit.Test;

public class 继承对象操作_Join模式 extends A操作
{
	private void 增老师(int size)
	{
		for (int i = 0; i < size; i++)
		{
			老师 o = new 老师();
			o.set姓名("老师" + i);
			o.set当前级别(老师.级别.中);
			em.persist(o);
		}
	}

	private void 增保安(int size)
	{
		for (int i = 0; i < size; i++)
		{
			保安 o = new 保安();
			o.set姓名("保安" + i);
			o.set负责区域("区" + i);
			em.persist(o);
		}
	}

	@Test
	public void 增()
	{
		增老师(2);
		增保安(3);
		增老师(2);
	}

	@Test
	public void 删()
	{
		增老师(2);
		增保安(3);

		变更事务();

		老师 o = em.find(老师.class, 1);
		System.out.println(o.getId());
		em.remove(o);
	}

	@Test
	public void 改_子类()
	{
		增老师(2);
		增保安(3);

		变更事务();

		老师 o = em.find(老师.class, 1);
		o.set当前级别(老师.级别.高);
	}

	@Test
	public void 改_父类()
	{
		增老师(2);
		增保安(3);

		变更事务();

		老师 o = em.find(老师.class, 2);
		o.set姓名("老师NNNNN");
	}

	@Test
	public void 查_子类()
	{
		增老师(2);
		增保安(3);

		变更事务();

		保安 o = em.find(保安.class, 4);
		System.out.println(o.get负责区域());
	}

	@Test
	/**
	 * 该方法会join查询子类,可能有性能问题
	 */
	public void 查_父类()
	{
		增老师(2);
		增保安(3);

		变更事务();

		职工 o = em.find(职工.class, 2);
		System.out.println(o.get姓名());

		o = em.find(职工.class, 4);
		System.out.println(o.get姓名());
	}

	@Test
	public void 批量查_子类()
	{
		增老师(2);
		增保安(3);

		变更事务();

		CriteriaBuilder cb = em.getCriteriaBuilder();
		CriteriaQuery<保安> cq = cb.createQuery(保安.class);
		Root<保安> root = cq.from(保安.class);
		cq.select(root);
		cq.where(cb.notLike(root.get(保安_.姓名), "保安1"));

		List<保安> list = em.createQuery(cq).getResultList();

		list.stream().forEach(System.out::println);
	}
	
	@Test
	/**
	 * 该方法会join查询子类,可能有性能问题
	 */
	public void 批量查_父类()
	{
		增老师(2);
		增保安(3);

		变更事务();

		CriteriaBuilder cb = em.getCriteriaBuilder();
		CriteriaQuery<职工> cq = cb.createQuery(职工.class);
		Root<职工> root = cq.from(职工.class);
		cq.select(root);
		cq.where(cb.notLike(root.get(职工_.姓名), "%1"));

		List<职工> list = em.createQuery(cq).getResultList();

		list.stream().forEach(System.out::println);
	}
}
